#ifndef VIDEOPLAYERMODEL_H
#define VIDEOPLAYERMODEL_H

#include <QObject>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QString>
#include <QUrl>

/**
 * @brief 视频播放器Model层
 * 
 * 封装QMediaPlayer和QMediaPlaylist，提供播放控制和播放列表管理接口
 * 采用MVC架构中的Model层，负责业务逻辑和数据管理
 */
class VideoPlayerModel : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 播放器状态枚举
     */
    enum PlayState {
        Stopped,    // 停止
        Playing,    // 播放中
        Paused      // 暂停
    };
    Q_ENUM(PlayState)

    /**
     * @brief 播放模式枚举
     */
    enum PlayMode {
        Sequential,     // 顺序播放
        Loop,          // 列表循环
        CurrentLoop,   // 单曲循环
        Random         // 随机播放
    };
    Q_ENUM(PlayMode)

    explicit VideoPlayerModel(QObject *parent = nullptr);
    ~VideoPlayerModel();

    // ========== 播放控制接口 ==========
    
    /**
     * @brief 开始播放
     */
    void play();

    /**
     * @brief 暂停播放
     */
    void pause();

    /**
     * @brief 停止播放
     */
    void stop();

    /**
     * @brief 跳转到指定位置
     * @param position 目标位置（毫秒）
     */
    void seek(qint64 position);

    /**
     * @brief 播放上一个视频
     */
    void previous();

    /**
     * @brief 播放下一个视频
     */
    void next();

    /**
     * @brief 设置音量
     * @param volume 音量值（0-100）
     */
    void setVolume(int volume);

    /**
     * @brief 设置播放速度
     * @param rate 播放速度（0.5x, 1.0x, 1.5x, 2.0x等）
     */
    void setPlaybackRate(qreal rate);

    // ========== 播放列表管理接口 ==========

    /**
     * @brief 添加视频到播放列表
     * @param filePath 视频文件路径
     * @return 是否添加成功
     */
    bool addMedia(const QString &filePath);

    /**
     * @brief 批量添加视频到播放列表
     * @param filePaths 视频文件路径列表
     * @return 成功添加的数量
     */
    int addMediaList(const QStringList &filePaths);

    /**
     * @brief 移除指定索引的视频
     * @param index 视频索引
     * @return 是否移除成功
     */
    bool removeMedia(int index);

    /**
     * @brief 清空播放列表
     */
    void clearPlaylist();

    /**
     * @brief 设置当前播放的视频索引
     * @param index 视频索引
     */
    void setCurrentIndex(int index);

    /**
     * @brief 设置播放模式
     * @param mode 播放模式
     */
    void setPlayMode(PlayMode mode);

    // ========== 状态查询接口 ==========

    /**
     * @brief 获取当前播放状态
     * @return 播放状态
     */
    PlayState playState() const;

    /**
     * @brief 获取当前播放位置
     * @return 播放位置（毫秒）
     */
    qint64 position() const;

    /**
     * @brief 获取当前视频总时长
     * @return 总时长（毫秒）
     */
    qint64 duration() const;

    /**
     * @brief 获取当前音量
     * @return 音量值（0-100）
     */
    int volume() const;

    /**
     * @brief 获取当前播放速度
     * @return 播放速度
     */
    qreal playbackRate() const;

    /**
     * @brief 获取当前视频索引
     * @return 视频索引
     */
    int currentIndex() const;

    /**
     * @brief 获取播放列表总数
     * @return 视频数量
     */
    int mediaCount() const;

    /**
     * @brief 获取当前播放模式
     * @return 播放模式
     */
    PlayMode playMode() const;

    /**
     * @brief 获取指定索引的媒体URL
     * @param index 视频索引
     * @return 媒体URL
     */
    QUrl mediaUrl(int index) const;

    /**
     * @brief 获取媒体播放器对象（用于View层连接视频输出）
     * @return QMediaPlayer指针
     */
    QMediaPlayer* mediaPlayer() const;

signals:
    // ========== 信号接口 ==========

    /**
     * @brief 播放状态变化信号
     * @param state 新的播放状态
     */
    void playStateChanged(PlayState state);

    /**
     * @brief 播放进度更新信号
     * @param position 当前播放位置（毫秒）
     */
    void positionChanged(qint64 position);

    /**
     * @brief 当前视频变化信号
     * @param index 新的视频索引
     */
    void currentMediaChanged(int index);

    /**
     * @brief 视频时长变化信号
     * @param duration 视频总时长（毫秒）
     */
    void durationChanged(qint64 duration);

    /**
     * @brief 音量变化信号
     * @param volume 新的音量值（0-100）
     */
    void volumeChanged(int volume);

    /**
     * @brief 播放模式变化信号
     * @param mode 新的播放模式
     */
    void playModeChanged(PlayMode mode);

    /**
     * @brief 播放列表变化信号（添加/删除/清空）
     */
    void playlistChanged();

    /**
     * @brief 错误信号
     * @param errorString 错误描述
     */
    void errorOccurred(const QString &errorString);

private slots:
    // ========== 内部槽函数 ==========

    /**
     * @brief 处理播放器状态变化
     * @param state QMediaPlayer状态
     */
    void onPlayerStateChanged(QMediaPlayer::State state);

    /**
     * @brief 处理播放列表当前项变化
     * @param position 新的位置
     */
    void onPlaylistCurrentIndexChanged(int position);

    /**
     * @brief 处理播放器错误
     * @param error 错误类型
     */
    void onPlayerError(QMediaPlayer::Error error);

private:
    QMediaPlayer *m_player;          // 媒体播放器
    QMediaPlaylist *m_playlist;      // 播放列表
    PlayState m_playState;           // 当前播放状态
    PlayMode m_playMode;             // 当前播放模式

    /**
     * @brief 初始化播放器
     */
    void initPlayer();

    /**
     * @brief 更新播放列表模式
     */
    void updatePlaylistMode();
};

#endif // VIDEOPLAYERMODEL_H

